home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994, Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
- * the contents of this file may not be disclosed to third parties, copied or
- * duplicated in any form, in whole or in part, without the prior written
- * permission of Silicon Graphics, Inc.
- *
- * RESTRICTED RIGHTS LEGEND:
- * Use, duplication or disclosure by the Government is subject to restrictions
- * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
- * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
- * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
- * rights reserved under the Copyright Laws of the United States.
- */
- /*------------------------------------------------------------------------------
- *
- * OORT - input.c - Routines for reading user input.
- *
- * $Id: input.c,v 1.2 1994/01/28 00:18:50 mtj Exp $
- *
- * Chris Fouts - April, 1993.
- *
- *----------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <gl/gl.h>
- #include <gl/device.h>
-
- #include <pf.h>
- #include <prmath.h>
-
- #include "oort.h"
- #include "radar.h"
- #include "dashboard.h"
- #include "input.h"
- #include "sound.h"
- #include "configure.h"
- #include "vehicle.h"
-
- /* BEGIN PROTOTYPES -S input.c */
- static void setPickCoords( short mx, short my ) ;
- /* END PROTOTYPES -S input.c */
-
-
- int debugOn = 0 ;
- int freezeTape = 0 ;
- int pausing = 0 ;
- int markPoint = 0 ;
- float startExpTime ;
- int roidZoom = 0 ;
- int braking ;
- int orbitalActive = 1 ;
-
- extern int showHelp ;
- extern int demoMode ;
- extern int cloakOn ;
- extern int stayInProgram ;
- extern int showStats ;
- extern int needToRepaint ;
- extern int selfStatus ;
- extern int newSelfStatus ;
- extern float mouseX ;
- extern float mouseY ;
- extern float pickX ;
- extern float pickY ;
- extern int leftMouseHit ;
- extern int middleMouseDown ;
- extern int rightMouseHit ;
- extern int sendingMessage ;
- extern float mvOverlayH ;
- extern float mvOverlayW ;
- extern float gameTime ;
- extern Player player[] ;
- extern int selfDestruct ;
- extern float selfDestructTime ;
- extern float selfDestructAlarmTime ;
- extern float latitude ;
- extern float longitude ;
-
- ViewPort mainVP ;
-
- extern ViewPort headingVP ;
- extern ViewPort dashboardVP ;
- extern ViewPort radarVP ;
- extern ViewPort indicatorVP ;
-
- static float mvMidX = 0.0f ;
- static float mvMidY = 0.0f ;
- static float mvScaleFactor = 1.0f ;
- static float winWidth = 1.0f ;
- static float winHeight = 1.0f ;
- static float winOrigX = 0.0f ;
- static float winOrigY = 0.0f ;
-
- /*------------------------------------------------------------------------------
- * Read user input.
- *----------------------------------------------------------------------------*/
- void
- grabInput(
- void
- )
- {
- int mouseMoved = 0 ;
- short val ;
- static short mx = 0 ;
- static short my = 0 ;
-
- while( qtest() )
- {
- if( !sendingMessage )
- {
- switch( qread( &val ) )
- {
- case MOUSEX :
- mx = val ;
- mouseMoved = 1 ;
- break ;
-
- case MOUSEY :
- my = val ;
- mouseMoved = 1 ;
- break ;
-
- case MIDDLEMOUSE :
- middleMouseDown = val ;
- mouseMoved = 1 ;
- break ;
-
- case SPACEKEY :
- if( val )
- {
- applyBrakes() ;
- }
- break ;
-
- case LEFTMOUSE :
- if( val )
- {
- leftMouseHit = 1 ;
- setPickCoords( mx, my ) ;
- }
- break ;
-
- case REDRAW :
- getWindowPosition() ;
- needToRepaint = 1 ;
- break ;
-
- case AKEY :
- if( val == 0 )
- {
- radarZoomOut() ;
- }
- break ;
-
- case ZKEY :
- if( val == 0 )
- {
- radarZoomIn() ;
- }
- break ;
-
- case QKEY :
- if( val == 1 )
- {
- changeAcceleration( -1.0f ) ;
- }
- break ;
-
- case WKEY :
- if( val == 1 )
- {
- changeAcceleration( -0.5f ) ;
- }
- break ;
-
- case EKEY :
- if( val == 1 )
- {
- changeAcceleration( 0.5f ) ;
- }
- break ;
-
- case RKEY :
- if( val == 1 )
- {
- changeAcceleration( 1.0f ) ;
- }
- break ;
-
- case BKEY :
- if( val == 0 && selfStatus ==
- OORT_ST_ON_GROUND )
- {
- selfDestruct = !selfDestruct ;
- if( selfDestruct )
- {
- postNewMessage( "Self "
- "destruct in 10 "
- "seconds." ) ;
- selfDestructTime =
- gameTime ;
- selfDestructAlarmTime =
- 0.0f ;
- }
- else
- {
- postNewMessage( "Self "
- "destruct canceled." ) ;
- }
- }
- break ;
-
- case CKEY :
- if( val == 0 )
- {
- cloakOn = !cloakOn ;
- toggleCloaking() ;
- }
- break ;
-
- case IKEY :
- if( val == 0 )
- {
- showConfiguration() ;
- }
- break ;
-
- case SKEY :
- if( val == 0 )
- {
- listScores() ;
- }
- break ;
-
- case F2KEY :
- if( val == 1 )
- {
- toggleTexturing() ;
- }
- break ;
-
- #if defined( DEBUG )
- case LEFTARROWKEY :
- roidZoom = 2 * val ;
- break ;
-
- case RIGHTARROWKEY :
- roidZoom = val ;
- break ;
-
- case VKEY :
- if( val == 0 )
- {
- markPoint = !markPoint ;
- }
- break ;
-
- case YKEY :
- if( val == 0 )
- {
- shieldDamage( 0.5f, 0 ) ;
- }
- break ;
-
- case DKEY :
- if( val == 0 )
- {
- debugOn = !debugOn ;
- postNewMessage( "Debug %s.",
- debugOn ? "on" :
- "off" ) ;
- }
- break ;
-
- case OKEY :
- if( val == 0 )
- {
- orbitalActive = !orbitalActive ;
- postNewMessage( "Orbitals %s.",
- orbitalActive ? "on" :
- "off" ) ;
- }
- break ;
-
- case KKEY :
- if( val == 0 )
- {
- blowUpSelf( 0 ) ;
- }
- break ;
- #endif /* defined( DEBUG ) */
-
- case F1KEY :
- if( val == 0 )
- {
- showStats = !showStats ;
- }
- break ;
-
- case FKEY :
- if( val == 0 )
- {
- freezeTape = !freezeTape ;
- postNewMessage( "Freeze %s.",
- freezeTape ? "on" :
- "off" ) ;
- }
- break ;
-
- case PKEY :
- if( val == 0 )
- {
- pausing = !pausing ;
- postNewMessage( "Pause %s.",
- pausing ? "on" :
- "off" ) ;
- }
- break ;
-
- case MKEY :
- if( val == 0 )
- {
- initMessage( MAIL_ALL ) ;
- }
- break ;
-
- case TKEY :
- if( val == 0 )
- {
- initMessage(
- player[SELF].team ) ;
- }
- break ;
-
- case UPARROWKEY :
- if( val == 0 )
- {
- postNewMessage( "Volume set to "
- "%d.",
- volumeChange( 1 ) ) ;
- sfx( SFX_OK ) ;
- }
- break ;
-
- case DOWNARROWKEY :
- if( val == 0 )
- {
- postNewMessage( "Volume set to "
- "%d.",
- volumeChange( -1 ) ) ;
- sfx( SFX_OK ) ;
- }
- break ;
-
- case RIGHTMOUSE :
- if( val )
- {
- rightMouseHit = 1 ;
- setPickCoords( mx, my ) ;
- }
- break ;
-
- case LKEY :
- if( val == 0 )
- {
- postNewMessage( "Lat:%.1f "
- "Lng:%.1f", latitude,
- longitude ) ;
- }
- break ;
-
- case HKEY :
- if( val == 0 )
- {
- showHelp = !showHelp ;
- }
- break ;
-
- case ESCKEY :
- if( val == 0 )
- {
- stayInProgram = 0 ;
- newSelfStatus = selfStatus =
- OORT_ST_EXIT ;
- }
- break ;
- }
- }
- else
- {
- switch( qread( &val ) )
- {
- case MOUSEX :
- mx = val ;
- mouseMoved = 1 ;
- break ;
-
- case MOUSEY :
- my = val ;
- mouseMoved = 1 ;
- break ;
-
- case MIDDLEMOUSE :
- braking = val ;
- mouseMoved = 1 ;
- break ;
-
- case LEFTMOUSE :
- if( val )
- {
- leftMouseHit = 1 ;
- setPickCoords( mx, my ) ;
- }
- break ;
-
- case REDRAW :
- getWindowPosition() ;
- needToRepaint = 1 ;
- break ;
-
- case KEYBD :
- addToMessage( (char)val ) ;
- break ;
-
- case UPARROWKEY :
- if( val == 0 )
- {
- postNewMessage( "Volume set to "
- "%d.",
- volumeChange( 1 ) ) ;
- sfx( SFX_OK ) ;
- }
- break ;
-
- case DOWNARROWKEY :
- if( val == 0 )
- {
- postNewMessage( "Volume set to "
- "%d.",
- volumeChange( -1 ) ) ;
- sfx( SFX_OK ) ;
- }
- break ;
-
- case RIGHTMOUSE :
- if( val )
- {
- rightMouseHit = 1 ;
- setPickCoords( mx, my ) ;
- }
- break ;
-
- case ESCKEY :
- if( val == 0 )
- {
- stayInProgram = 0 ;
- newSelfStatus = selfStatus =
- OORT_ST_EXIT ;
- }
- break ;
-
- }
- }
- }
-
- if( mouseMoved && !pausing )
- {
- mouseX = 2.0f * ( (float)mx - mvMidX ) / mvScaleFactor ;
- if( mouseX > 1.0f )
- {
- mouseX = 1.0f ;
- }
- else if( mouseX < -1.0f )
- {
- mouseX = -1.0f ;
- }
-
- mouseY = 2.0f * ( (float)my - mvMidY ) / mvScaleFactor ;
- if( mouseY > 1.0f )
- {
- mouseY = 1.0f ;
- }
- else if( mouseY < -1.0f )
- {
- mouseY = -1.0f ;
- }
- }
- }
-
-
-
- /*------------------------------------------------------------------------------
- * Determine the center of the window
- *----------------------------------------------------------------------------*/
- void
- getWindowPosition(
- void
- )
- {
- long ox ;
- long oy ;
- long sizeX ;
- long sizeY ;
- float fovx ;
- float cx ;
- float cy ;
- float sx ;
- float sy ;
- pfVec4 pt ;
- pfMatrix m ;
-
- getorigin( &ox, &oy ) ;
- getsize( &sizeX, &sizeY ) ;
-
- winWidth = (float)sizeX ;
- winHeight = (float)sizeY ;
-
- winOrigX = (float)ox ;
- winOrigY = (float)oy ;
-
- mvMidX = 0.5 * winWidth + (float)ox ;
- mvMidY = 0.5 * winHeight * ( 1.0f + MAIN_VIEW_BOTTOM ) + (float)oy ;
-
- if( winWidth < ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight )
- {
- mvScaleFactor = winWidth ;
- mvOverlayW = 1.0f ;
- mvOverlayH = ( 1.0f - MAIN_VIEW_BOTTOM )*winHeight / winWidth ;
- }
- else
- {
- mvScaleFactor = ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight ;
- mvOverlayW = winWidth /
- ( ( 1.0f - MAIN_VIEW_BOTTOM ) * winHeight ) ;
- mvOverlayH = 1.0f ;
- }
-
- /*
- * Determine location of main window.
- */
- mainVP.left = 0 ;
- mainVP.right = winWidth - 1 ;
- mainVP.top = winHeight - 1 ;
- mainVP.bottom = MAIN_VIEW_BOTTOM * winHeight ;
-
- /*
- * Determine location of dashboard.
- */
- setDashboardPosition( 0, winWidth - 1,
- 0, (int)( MAIN_VIEW_BOTTOM * winHeight - 1 ) ) ;
-
- /*
- * Determine location of compass.
- */
- headingVP.left = 0 ;
- headingVP.right = 100 ;
- headingVP.top = MAIN_VIEW_BOTTOM * winHeight - 1 ;
- headingVP.bottom = headingVP.top - 100 ;
-
- /*
- * Determine position of roll/pitch indicator.
- */
- m[0][0] = 2.0f / ( mvOverlayW + mvOverlayW ) ;
- m[0][1] = 0.0f ;
- m[0][2] = 0.0f ;
- m[0][3] = 0.0f ;
-
- m[1][0] = 0.0f ;
- m[1][1] = 2.0f / ( mvOverlayH + mvOverlayH ) ;
- m[1][2] = 0.0f ;
- m[1][3] = 0.0f ;
-
- m[2][0] = 0.0f ;
- m[2][1] = 0.0f ;
- m[2][2] = -1.0f ;
- m[2][3] = 0.0f ;
-
- m[3][0] = 0.0f ;
- m[3][1] = 0.0f ;
- m[3][2] = 0.0f ;
- m[3][3] = 1.0f ;
-
- /*
- * Transform opposite corners of where indicator region is
- * s'posed to be.
- */
- sx = 0.5 * ( mainVP.right - mainVP.left + 1.0 ) ;
- sy = 0.5 * ( mainVP.top - mainVP.bottom + 1.0 ) ;
- cx = 0.5 * ( mainVP.right + mainVP.left ) ;
- cy = 0.5 * ( mainVP.top + mainVP.bottom ) ;
-
- pt[0] = -0.2f ;
- pt[1] = -0.2f ;
- pt[2] = 0.0f ;
- pt[3] = 1.0f ;
- pfXformVec4( pt, pt, m ) ;
-
- pt[0] /= pt[3] ;
- pt[1] /= pt[3] ;
-
- indicatorVP.left = (int)( pt[0] * sx + cx + 0.5 ) ;
- indicatorVP.bottom = (int)( pt[1] * sy + cy + 0.5 ) ;
-
- pt[0] = 0.2f ;
- pt[1] = 0.2f ;
- pt[2] = 0.0f ;
- pt[3] = 1.0f ;
- pfXformVec4( pt, pt, m ) ;
-
- pt[0] /= pt[3] ;
- pt[1] /= pt[3] ;
-
- indicatorVP.right = (int)( pt[0] * sx + cx + 0.5 ) ;
- indicatorVP.top = (int)( pt[1] * sy + cy + 0.5 ) ;
- }
-
-
-
- /*------------------------------------------------------------------------------
- * Specify which devices we're interested in.
- *----------------------------------------------------------------------------*/
- void
- setDevices(
- void
- )
- {
- qdevice( ESCKEY ) ;
- qdevice( MOUSEX ) ;
- qdevice( MOUSEY ) ;
- qdevice( RIGHTMOUSE ) ;
- qdevice( AKEY ) ;
- qdevice( ZKEY ) ;
- qdevice( UPARROWKEY ) ;
- qdevice( DOWNARROWKEY ) ;
- qdevice( F1KEY ) ;
- qdevice( F2KEY ) ;
- qdevice( REDRAW ) ;
- qdevice( SKEY ) ;
- if( !demoMode )
- {
- qdevice( KEYBD ) ;
- qdevice( MIDDLEMOUSE ) ;
- qdevice( LEFTMOUSE ) ;
- qdevice( BKEY ) ;
- qdevice( CKEY ) ;
- qdevice( FKEY ) ;
- qdevice( HKEY ) ;
- qdevice( LKEY ) ;
- qdevice( IKEY ) ;
- qdevice( MKEY ) ;
- qdevice( PKEY ) ;
- qdevice( TKEY ) ;
- qdevice( QKEY ) ;
- qdevice( WKEY ) ;
- qdevice( EKEY ) ;
- qdevice( RKEY ) ;
- qdevice( SPACEKEY ) ;
- #if defined( DEBUG )
- qdevice( RIGHTARROWKEY ) ;
- qdevice( LEFTARROWKEY ) ;
- qdevice( DKEY ) ;
- qdevice( KKEY ) ;
- qdevice( OKEY ) ;
- qdevice( VKEY ) ;
- qdevice( YKEY ) ;
- #endif /* defined( DEBUG ) */
- }
- }
-
-
-
- /*------------------------------------------------------------------------------
- * Calculate the normalized pick coordinates relative to the main viewport.
- *----------------------------------------------------------------------------*/
- static void
- setPickCoords(
- short mx,
- short my
- )
- {
- pickX = ( (float)mx - winOrigX - mainVP.left ) /
- (float)( mainVP.right - mainVP.left ) ;
- pickY = ( (float)my - winOrigY - mainVP.bottom ) /
- (float)( mainVP.top - mainVP.bottom ) ;
- }
-
-
-
-